晓晓的个人博客Logo
晓晓的个人博客
Chrome Extension短连接消息回复竞争问题【未完待续】
AI提炼icon
提炼
文章围绕 Chrome Extension 中消息竞争回复问题展开,引用官方文档提示,指出当发送短连接消息后,多个接收方监听函数处理消息时,发送方仅接收最先调用sendResponse函数返回的消息,其余忽略。“多个监听函数” 可分布于多个插件或一个插件的不同部分。作者凭借自身经验,成功验证了两种场景:一是一个接收方设置多个监听函数,通过在一个插件内,Content 层发送消息,Service Worker/option 设置多个监听函数捕获处理消息的代码示例展示;二是多个接收方各自设置监听函数,以多个插件间,一个插件 Content 层发送消息,另一个插件的 Service Worker 与 option 页面都监听函数的代码示例说明。最后作者表示若后续验证其他场景将及时更新。
本文于 2025-07-22 13:24 首次发布,最后修改于 2025-08-24 16:20

课题背景与场景

If multiple pages are listening for onMessage events, only the first to call sendResponse() for a particular event will succeed in sending the response. All other responses to that event will be ignored.

---来自《Chrome Extension开发者文档》

官方文档的这句提示词就是在说 消息竞争回复 的问题,大致意思就是当发送方将短连接消息发送出去后,由于有多个接收方的监听函数在处理这个消息,但最终发送方能接收到的消息回复是多个监听函数中最先调用 sendResponse 函数返回的那条消息,其他晚到的消息都会被忽略。

其中,需要特别说明的是:根据笔者经验,提示中的“多个监听函数”是可以分布在 多个插件之间或一个插件的多个部分中 的。

但是,由于笔者经验有限,当前只验证成功了以下几种场景:

1. 一个接收方、设置了多个监听函数

此条,适用于一个插件中的 Content 与 Service Worker/option 之间,也适用于一个插件向另一个插件发送消息时,接收方插件设置了多个监听函数的场景;

这里,笔者使用“ 一个插件中,Content 层作为发送方,Service Worker/option 设置了多个监听函数来捕获&处理消息 ”来展示代码。

上面这些代码执行之后,得到的结果是:“Content received response:Hello from background script-500!”;

2. 多个接收方、各自设置了监听函数

此条,适用于一个插件中的 Content 与 Service Worker/option,也适用于一个插件向另一个插件发送消息时,接收方插件设置了多个监听函数的场景;

这里,笔者使用“ 多个插件间,其中一个插件 Content 层作为发送方,另一个插件的 Service Worker 与 option 页面都监听了函数 ”来展示代码。

上面这些代码执行之后,得到的结果是:“Content received response:Message received by options page”;

写在最后

虽然由于笔者现在的经验甚少、暂时只找到了以上这两种场景,但是往后如果验证完成其他场景的,笔者也会及时更新的哦~

1个赞
喜欢就点个赞吧